C语言编程规范与陷阱50问
📚 共计 50 章节
01
变量声明与初始化
未初始化变量的陷阱与规范
基础
内存
02
宏定义与副作用
带参宏的括号陷阱与多次求值问题
预处理器
陷阱
03
指针与数组
数组名退化为指针的陷阱
指针
数组
04
字符串处理
strcpy与strncpy的安全使用规范
字符串
安全
05
内存管理
malloc与free的配对原则与野指针
动态内存
泄漏
06
结构体对齐
内存对齐的规则与#pragma pack的使用
结构体
底层
07
位操作
有符号数的右移与符号位扩展
位运算
可移植性
08
类型转换
隐式类型转换带来的精度丢失与溢出
类型
陷阱
09
const关键字
const指针的三种形态与使用场景
const
安全
10
static关键字
static修饰局部变量、全局变量与函数的作用域变化
存储类
作用域
11
volatile关键字
volatile在嵌入式中断与多线程中的必要性
嵌入式
多线程
12
extern关键字
extern "C"在C与C++混合编程中的作用
链接
C++
13
typedef与#define
类型别名定义的区别与陷阱
类型定义
宏
14
函数指针
回调函数的声明与调用规范
指针
回调
15
可变参数
va_list的使用与类型安全问题
可变参数
安全
16
断言与错误处理
assert的合理使用与生产环境移除
调试
断言
17
头文件保护
#ifndef/#define/#endif与#pragma once的选择
头文件
编译
18
循环控制
for循环中i++与++i的效率差异
性能
循环
19
switch语句
case穿透与default分支的必要性
控制流
陷阱
20
goto语句
goto的合理使用场景与滥用风险
控制流
争议
21
递归函数
递归深度与栈溢出的陷阱
递归
栈
22
文件操作
fopen与fclose的配对与文件描述符泄漏
文件
资源管理
23
缓冲区溢出
gets函数的禁用与fgets的替代
安全
字符串
24
格式化字符串
printf格式化字符串的漏洞与安全写法
漏洞
格式化
25
动态数组
realloc的使用陷阱与内存碎片
内存
realloc
26
链表操作
链表节点删除时的内存泄漏问题
数据结构
泄漏
27
回调函数上下文
函数指针与void*参数传递的规范
回调
设计
28
多文件编程
全局变量的extern声明与定义分离
模块化
链接
29
编译单元
static函数与内部链接的封装优势
封装
static
30
内联函数
inline关键字与编译器优化行为
优化
inline
31
restrict关键字
指针别名与编译器优化
C99
优化
32
对齐访问
非对齐内存访问导致的硬件异常
硬件
可移植性
33
字节序
大端与小端在网络编程中的处理
网络
字节序
34
位域
位域的内存布局与跨平台问题
位域
跨平台
35
联合体
union的类型双关与未定义行为
union
未定义
36
枚举
enum的底层类型与值范围陷阱
枚举
类型
37
空指针
NULL与nullptr的区别及解引用风险
指针
安全
38
悬挂指针
返回局部变量地址的陷阱
指针
生命周期
39
二维数组
二维数组作为函数参数的传递方式
数组
参数
40
函数声明
隐式函数声明与C89/C99标准差异
标准
声明
41
运算符优先级
++与*等运算符的优先级混淆
运算符
陷阱
42
逗号表达式
逗号运算符的求值顺序与陷阱
运算符
求值
43
短路求值
&&与||的短路特性及其依赖
逻辑
求值
44
浮点数比较
浮点数直接相等比较的精度问题
浮点
精度
45
随机数
rand()的种子设置与伪随机数周期
随机数
库函数
46
信号处理
信号处理函数中的可重入性问题
信号
可重入
47
setjmp/longjmp
非局部跳转与资源泄漏风险
跳转
异常
48
线程安全
全局变量与静态变量的线程竞争
多线程
竞争
49
原子操作
C11原子操作与volatile的区别
原子
C11
50
代码风格
命名规范、缩进风格与注释规范的一致性
规范
可读性